home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / cw_write.arc / CWDKIT4.DOC < prev    next >
Text File  |  1990-04-22  |  31KB  |  646 lines

  1.  
  2.             Centiwrite 1.10 Developer's Kit and User's Manual
  3.              Both Items Copyright 1988 Andrew M. Saucci, Jr.
  4.  
  5.  Note that you may also inspect the copyright notice of the file CENTWRI4.TPU
  6.  by entering "copy centwri4.tpu /b con" at the DOS prompt. Ignore all the
  7.  beeping and stumbling and wait for this command to finish executing.
  8.  
  9.  ****************************************************************************
  10.  
  11.                Centiwrite 1.10 Developer's Kit User's Manual
  12.                ========== ==== =========== === ====== ======
  13.  
  14.                     Copyright 1988 Andrew M. Saucci, Jr.
  15.  
  16.                             What's to Follow
  17.  
  18.  1. Introduction
  19.  2. About the Author
  20.  3. The Interface of the Unit
  21.  4. What You'll Need to Compile
  22.  5. The Basic Principles
  23.  6. A Sample Calling Program
  24.  7. Analysis of the Sample Program
  25.  8. The Initial Values
  26.  9. Initializing the Array
  27. 10. How to Overlay the Unit
  28. 11. Compatibility Consideration
  29. 12. For Extra Punch in Your Program
  30. 13. Down to Brass Tacks
  31. 14. Boilerplate
  32. 15. To All Those Who Helped
  33. 16. Coming Attractions
  34. 17. It's Alive!
  35.  
  36.  =============================================================================
  37.  
  38.                              Introduction
  39.  
  40.           Congratulations on having acquired this useful developer's tool. Now
  41. you can have an "instant editor" in your own programs whenever you need to
  42. include the capability to create short memos, notes, or letters. This file
  43. will attempt to show you how to incorporate the Centiwrite 1.10 editor into
  44. your Turbo Pascal programs. If you are unfamiliar with this editor, you should
  45. definitely obtain a copy of the stand-alone version of Centiwrite and read its
  46. User's Manual. This explains in detail the operation of the editor. Of course,
  47. as a "developer" (one of the initiated), you'll gain access to some features
  48. not used in the stand-alone version.
  49.  
  50.  =============================================================================
  51.  
  52.                             About the Author
  53.  
  54.           Andrew M. Saucci, Jr. was graduated with distinction from the
  55. New York Institute of Technology with a master's degree in computer science.
  56. He received a bachelor's degree in computer science from Hofstra University.
  57. A member of the Association of Shareware Professionals (ASP) and the
  58. Association for Computing Machinery (ACM), Mr. Saucci has programmed in
  59. Turbo Pascal for over one year. He is also the author of the program
  60. The Holy Rosary.
  61.  
  62.           Mr. Saucci can be reached at any of the following electronic mail
  63. addresses:
  64.  
  65. CompuServe  72117,241
  66. Delphi      ASAUCCI
  67. Genie       A.SAUCCI3
  68. The Source  BFE501
  69. BIX         ASAUCCI
  70.  
  71.           Comments about any of his products are most welcome; however,
  72. please allow one week for a response to your initial inquiry. After that,
  73. an "active" mailbox is checked daily. Also, for guaranteed service, use
  74. the regular mail facility of your service rather than a bulletin board area,
  75. or send a regular mail note saying to check the bulletin board. One week is
  76. a "worst case" situation. Often, mailboxes are checked more frequently.
  77.  
  78.  =============================================================================
  79.  
  80.                         The Interface of the Unit
  81.  
  82. unit centwri4;
  83. interface
  84.     uses dos, crt;
  85.     type scarray= array [1..62] of string[85];
  86.          commstruc= record
  87.                     screline: scarray;
  88.                     lastring, initWhereX, initWhereY: byte;
  89.                     CurAttr, StdAttr, MessAttr, WarnAttr: byte;
  90.                     passkey: integer;
  91.                     TimeOutInterval, NextTimeOut, oldhours: word;
  92.                     BlankChar: char;
  93.                     insmode, RetCtrlKeys, ShowStatusLine, TimeOut: boolean;
  94.                     end;
  95.     function nextword (sentence: string): integer;
  96.     function lastword (sentence: string): integer;
  97.     function isletter (charcode: char): boolean;
  98.     function isdigit (charcode: char): boolean;
  99.     function datestring: string;
  100.     function timestring: string;
  101.     function CheckSumVidBuf (x1, y1, count: byte): word;
  102.     function BufChar (xlimit, ylimit: byte): byte;
  103.     procedure AnalyzeKey (var inkey: integer; var scancode: byte);
  104.     procedure DelWord (var sentence: string; position: integer);
  105.     procedure Centiwrite (var infoexch: commstruc);
  106.  
  107. implementation
  108. { Implementation would follow here. }
  109.  
  110.  
  111. Each of the variables used in the "commstruc" (for "communications structure"
  112. record is described below.
  113.  
  114. screline: The strings which represent each line of the text to a maximum of
  115.           62. This accomodates 25-, 43-, and 50-line screens.
  116.  
  117. lastring: The number of currently "valid" strings in screline. Because a line
  118.           consisting solely of a carriage return (ASCII 13-10) is represented
  119.           by a null string, "lastring" indicates how many lines of screline
  120.           are currently being used. Note that in an empty file, lastring is 1.
  121.  
  122. initWhereX: The initial x-coordinate of the cursor on entry to the editor.
  123.  
  124. initWhereY: The initial y-coordinate of the cursor on entry to the editor.
  125.  
  126. CurAttr: The color attribute of the cursor. You can use any valid attribute.
  127.          If the foreground and background are the same, the Centiwrite editor
  128.          assumes that the blinking hardware cursor is being used, and the
  129.          software cursor is disabled. The cursor will appear as a blinking
  130.          CHARACTER if a background color greater than 7 is used.
  131.  
  132. StdAttr: The normal color attribute of the editor.
  133.  
  134. MessAttr: The color attribute for messages which appear on the status line.
  135.  
  136. WarnAttr: The color attribute for the word "Overstrike" when visible.
  137.  
  138. TimeOutInterval: The number of minutes between timeouts. If this is set
  139.                  to zero, timeouts are disabled.
  140.  
  141. NextTimeOut: Time in minutes of the next timeout. If the next timeout is
  142.              at 4:43, this variable could have the values 43, 103, 163, ...
  143.              through 65535 (the maximum for a word), or (43+ 60*n), where
  144.              n is the number of hours to the next timeout. On the hour,
  145.              NextTimeOut is decremented by 60 (if it exceeds 59).
  146.  
  147. oldhours: Hours at the last time check. This is passed as part of the
  148.           structure because the calling program must initialize it before
  149.           the first call to Centiwrite. You should re-initialize it if
  150.           you leave Centiwrite for more than an hour. Basically, this is
  151.           used as a "rollover" flag.
  152.  
  153. passkey: The character passed back to the main program when Centiwrite does
  154.          not define a function for it. (This is now an INTEGER.)
  155.  
  156. BlankChar: The character that is displayed at the cursor position when
  157.            the character at that position is either ASCII zero, ASCII 32
  158.            (blank), or ASCII 255. All of these normally appear as a blank,
  159.            and you may need to choose an alternate character, particularly
  160.            for those using monochrome monitors. You may select any character
  161.            except ASCII 7, 8, 10, or 13.
  162.  
  163. insmode: If true, then the editor is in Insert mode. Otherwise, Overstrike
  164.          mode is used.
  165.  
  166. RetCtrlKeys: Set this to true if you want control keys (ASCII 1 to 31,
  167.              except 8, 9, and 13) returned to the calling program.
  168.              Otherwise, set it to false so that Ctrl-L, for example,
  169.              will insert an ASCII 12 (form-feed). Even if control keys
  170.              are returned, using the Alt+ numeric keypad method of
  171.              entering characters will always insert the appropriate
  172.              character, except for ASCII 7, 8, 10, and 13, which are
  173.              ignored. Backspace, Tab, and Enter are never returned this way.
  174.  
  175. ShowStatusLine: Set this flag to true if you require the status line,
  176.                 which shows the current state of Insert/Overstrike and
  177.                 the current position on the screen. If this is set to
  178.                 false, no status line is displayed and the top line
  179.                 is available for editing. When ShowStatusLine is false,
  180.                 the Insert key is returned to the calling procedure for
  181.                 action, so that any display or indication of the Insert/
  182.                 Overstrike mode that the caller maintains (in lieu of
  183.                 the status line) may be updated by the caller. Also, the
  184.                 F5, F8, and Ctrl-F8 keys are ignored (because they use
  185.                 the status line for their display).
  186.  
  187. TimeOut: When set to true, TimeOut indicates that the calling procedure
  188.          has received control on account of a timeout, and that the
  189.          appropriate timeout procedures or functions should be
  190.          executed. Otherwise, the caller received control because of
  191.          an unrecognized or Ctrl-key.
  192.  
  193. The functions and procedures which are included are summarized next.
  194.  
  195. nextword: Returns the position of the next word in a string. In the string
  196.           "for he's a jolly good fellow", nextword returns 4. If no "next
  197.           word" is found, the return value is the length of the string plus 1.
  198.  
  199. lastword: Returns the position of the last word in a string. In the string
  200.           "which nobody can deny", lastword returns 18. If the string is a
  201.           single word, the return value is 1.
  202.  
  203. datestring: Returns the current system date in the form "Monday, May 26, 1988".
  204.  
  205. timestring: Returns the current system time in the form "10:45:44 PM".
  206.  
  207. CheckSumVidBuf: Returns a checksum of the characters in the video buffer
  208.                 starting at a given location (in REAL coordinates-- not
  209.                 those recognized by the CRT unit) and continuing for
  210.                 count characters. This procedure is not used by the
  211.                 editor, but is included because it is important to
  212.                 all programmers who want to discourage tampering with
  213.                 their programs. (Real coordinates start at 0,0 and are
  214.                 not relative to the current window.)
  215.  
  216. BufChar: Returns the character at the cursor location and advances the
  217.          cursor one column to the right, or to the beginning of the
  218.          next line. "xlimit" is the x-coordinate (again, in real coordinates)
  219.          at which the cursor should wrap to the next line. "ylimit" is the
  220.          y-coordinate of the bottom of the screen. If the cursor is in the
  221.          lower right corner of the screen, the character is returned but
  222.          the cursor is not advanced. This function is also not used by
  223.          the editor, but is the function that the stand-alone version
  224.          of Centiwrite uses to load a screen into the editor. Now you
  225.          can use it, too!
  226.  
  227. AnalyzeKey: Substitute keyboard reading procedure (for ReadKey). A single
  228.             call returns all pertinent keyboard information-- no need to
  229.             make multiple calls to check for extended key codes.
  230.             Extended key codes are returned in inkey as values in excess
  231.             of 255-- for example, F6 is returned as 322. Note that "inkey"
  232.             is an INTEGER variable. To get the value returned in "inkey",
  233.             add 256 to the extended key code (F6 is 322, or 64+ 256).
  234.             This procedure is now written in assembly language for
  235.             extra speed.
  236.  
  237. DelWord: Deletes the word starting at a given location in a string.
  238.  
  239. Centiwrite: The editor itself.
  240.  
  241.  =============================================================================
  242.  
  243.                        What You'll Need to Compile
  244.  
  245.           In order to compile a program using Centiwrite, you need to copy
  246. CENTWRI4.TPU into the directory where Turbo Pascal normally looks for your
  247. .TPU files. In version 4.0, this can be the EXE directory specified under
  248. the Options/Directories menu selection. You will also need to add the line
  249. "uses centwri4;" to the the source file of the procedure that calls the
  250. editor. Check your Turbo Pascal manual for additional information on including
  251. units in your programs. Oh, yes, you'll also need Turbo Pascal version 4.0.
  252. To use the editor with Turbo Pascal 5.0, you must obtain the CENTWRI5.TPU unit.
  253. For those concerned about needing to recompile for upgrades of the compiler,
  254. the current plan is that this unit be updated whenever a new version of
  255. Turbo Pascal is released. Upgrades will be available for a modest charge.
  256.  
  257.  =============================================================================
  258.  
  259.                            The Basic Principles
  260.  
  261.           The Centiwrite editor is based upon an "array of strings"
  262. implementation. While not suitable for a large text editor or word processor,
  263. this approach is quite adequate for a simple program such as this. It allows
  264. a "quick and dirty" style, and is easily understandable. Each element in the
  265. array of strings represents a line of text on the screen. An "implied"
  266. carriage return ends each line. A count of the current number of lines is
  267. maintained at all times. A duplicate array is maintained in memory in order
  268. to facilitate the "Undo" feature (invoked by F3).
  269.  
  270.           Some may wonder why the video memory is not used to store the
  271. text, considering that the text is stored there anyway. Use of character
  272. strings allows the use of Turbo Pascal's string-handling procedures. Using
  273. video memory would mean writing substantially more code in order to duplicate
  274. the functions already available in the runtime library. This code would not
  275. only make the program larger, but would also need to be debugged. The Turbo
  276. Pascal string-handling routines (while not perfect) are already thoroughly
  277. debugged.
  278.  
  279.  =============================================================================
  280.  
  281.                         A Sample Calling Procedure
  282.  
  283.           The following program is an example of how to call the editor.
  284.  
  285. program CallEditor (input, output);
  286. uses dos, crt, centwri4;
  287. var reg: registers;
  288. origcx: word;
  289. cwinfo: commstruc;
  290. i: byte;
  291. hours, minutes, seconds, hundredths: word;
  292.  
  293. procedure SaveFile;
  294. begin
  295. writeln ('Code for saving a file would be here.');
  296. delay (2500);
  297. end;
  298.  
  299. procedure HelpProcedure;
  300. begin
  301. writeln ('Help! Help!');
  302. delay (2500);
  303. end;
  304.  
  305. begin
  306. reg.ah:= $03;
  307. reg.bh:= $00;
  308. intr ($10, reg);  { Save old cursor }
  309. origcx:= reg.cx;
  310. reg.ah:= $01;
  311. reg.cx:= $2000;
  312. intr ($10, reg);  { Disable hardware cursor }
  313. with cwinfo do    { Allows unqualified variable references. }
  314. begin
  315. insmode:= true;     { Initialize structure variables. }
  316. initWhereX:= 1;
  317. initWhereY:= 1;
  318. CurAttr:= $70;  { Black on LightGray }
  319. StdAttr:= $17;  { LightGray on Blue }
  320. MessAttr:= $20; { Black on Green }
  321. WarnAttr:= $4F; { White on Red }
  322. for i:= 1 to 25 do
  323.     screline[i]:= '';  { empty file }
  324. lastring:= 1;
  325. passkey:= 0;
  326. RetCtrlKeys:= false;
  327. ShowStatusLine:= true;
  328. BlankChar:= #32; { pick the blank character because of the CurAttr we used }
  329. TimeOutInterval:= 5;  { causes a timeout every five minutes }
  330. GetTime (hours, minutes, seconds, hundredths);
  331. NextTimeOut:= minutes+ TimeOutInterval;   { set first timeout }
  332. oldhours:= hours;     { initialize rollover flag }
  333. repeat
  334.    window (1, 1, 80, 25);
  335.    TextAttr:= $07;
  336.    ClrScr;
  337.    writeln ('Joe''s Program: Centiwrite Editor-- Alt-X to Exit');
  338.    window (1, 2, 80, 25);
  339.    Centiwrite (cwinfo);      { <------------- PLUG-IN EDITOR }
  340.    window (1, 1, 80, 25);
  341.    TextAttr:= $07;
  342.    if TimeOut     { Short-circuit the other tests-- passkey contains }
  343.       then begin  { values which have already been processed. }
  344.            passkey:= 0;
  345.            end;
  346.    if ((passkey= 346) or (passkey= 316)) or (TimeOut)
  347.       { If Alt-X, F2, or TimeOut, save the file. }
  348.       then SaveFile;
  349.    if passkey= 315  { F1 displays a list of keys and their functions. }
  350.       then HelpProcedure;
  351. until ((passkey= 288) or (passkey= 346));  { Alt-D or Alt-X (exit condition) }
  352. end;  { with statement }
  353. ClrScr;
  354. reg.ah:= $01;
  355. reg.cx:= origcx;
  356. intr ($10, reg); { restore cursor }
  357. end.  { program }
  358.  
  359.  =============================================================================
  360.  
  361.                        Analysis of the Sample Program
  362.  
  363.           Take a close look at the sample program. Although it has been
  364. simplified in order to highlight the main points, its basic structure is
  365. the same as that of the stand-alone version of Centiwrite 1.10. You should
  366. be able to compile and run it. It gives initial values to the members of the
  367. structure, and then runs the editor in a repeat..until loop.
  368.  
  369.           Why a loop? This is the means you can use to add your own "frills"
  370. to the editor. Any time the Centiwrite editor sees a key that it does not
  371. recognize, such as F9, Alt-Z, or PageDown, the editor terminates and control
  372. returns to the calling procedure. Placing the editor in a loop gives you a
  373. chance to execute whatever procedures or functions you like before RETURNING
  374. control, or exiting if you like. For example, Alt-X is the "recommended" exit
  375. key. The editor takes no special action on seeing Alt-X; it merely exits just
  376. the same as it would for any other unrecognized key. The "until" condition
  377. "passkey=288" is what causes the sample program to terminate. To use F10 as
  378. an exit key, just change the condition to "passkey=324". Likewise, what
  379. displays help is "passkey=315"; to use Shift-F1, change to "passkey=340".
  380.  
  381.          Note that the editor recognizes all keys that return an ASCII value
  382. plus the following extended keys:
  383.  
  384. arrow keys        Shift-Tab          Ctrl-Left arrow       Alt- B E H T V Y
  385. Insert            Home/End           Ctrl-Right arrow      F3  F5  F7  F8
  386. Delete            Ctrl-Home/End      Ctrl-F8
  387.  
  388.          The calling procedure is passed any other keys and may deal with them
  389. however it sees fit. The variable "passkey" will hold the value of the last
  390. key pressed. By using the flag RetCtrlKeys, you can specify additional keys
  391. to be returned.
  392.  
  393.           Notice the "window" statement just before the call to Centiwrite.
  394. This is absolutely necessary in order for the editor to establish its window
  395. boundaries and insure the integrity of its screen. The editor can operate
  396. in a window no narrower than 40 columns. It has not been tested in windows
  397. of fewer than 24 rows; however, it should work for any number of rows.
  398. (For a single row "window" you should use "liminput", the complete source
  399. code to which is found in the Deciwrite Developer's Kit.) If you specify a
  400. window size of fewer than 40 columns, greater than the screen width, or
  401. greater than the screen height, the result is unknown.
  402.  
  403.           The Centiwrite editor redraws its window each time it is called, and
  404. it leaves the screen in place when it exits. Therefore, you can put a window
  405. over it without any trouble.
  406.  
  407.  ============================================================================
  408.  
  409.                           The Initial Values
  410.  
  411.           The most important value in "commstruc" is "lastring". If you use
  412. an invalid value for lastring, the editor will become confused and behave
  413. erratically. Lastring should be 1 for an empty file. Otherwise, it reflects
  414. the number of currently valid strings in the array "screline".
  415.  
  416. Example.
  417.  
  418. If screline is this (line numbers added):
  419.  
  420. [1] Now is the time for all good people.
  421. [2] We must mobilize now.
  422. [3]
  423. [4] May we have your support?
  424.  
  425. then lastring is 4. If two carriage returns are added after line 4, as in
  426.  
  427. [4] May we have your support?
  428. [5]
  429. [6]
  430.  
  431. then lastring is 6. Lastring should only be changed when the number of lines
  432. in the text is changed.
  433.  
  434.           Here's an important note about carriage returns. The Centiwrite
  435. editor does NOT add the ASCII 13-10 combination explicitly to the text. Every
  436. string ends in an IMPLIED 13-10. If you write a file to disk, you must add the
  437. 13-10 yourself. This is easily done using a "writeln(screline[i])"-type
  438. statement. You need not delete a 13-10 on input, however, as the editor
  439. automatically removes these (as well as ASCII 7 and 8) from the text. You
  440. should, however, take care to format the input strings so that they do not
  441. contain embedded carriage returns that really belong at the end of a line.
  442.  
  443.           InitWhereX and initWhereY are used to position the cursor when
  444. the editor is called. For the first invocation, each of these should usually be
  445. set to 1, although any valid values are acceptable. Never position the cursor
  446. below the row "lastring", or erratic operation will result. When the editor
  447. passes control back to the calling procedure, the current cursor position is
  448. saved in initWhereX and initWhereY. It can then be reused if necessary when
  449. the editor is called again. Pressing F9 demonstrates this simply. The cursor
  450. position is saved; the editor returns control to the main program; the main
  451. program ignores the key (because no function has been defined for it there,
  452. either); and the editor regains control, positioning the cursor at the saved
  453. location.
  454.  
  455.           Insmode, as explained earlier, is simply a flag. It's your choice--
  456. set it however you like depending upon whether you want to start the editor in
  457. Insert mode or Overstrike mode.
  458.  
  459.           Passkey must be initialized. If a timeout occurs before the first
  460. key is pressed, the internal check of passkey will fail if passkey
  461. contains garbage.
  462.  
  463.           You must also initialize BlankChar, RetCtrlKeys, and ShowStatusLine.
  464. They are explained previously.
  465.  
  466.           You do not have to initialize TimeOut, because it is set to
  467. false each time the editor is called.
  468.  
  469.  ============================================================================
  470.  
  471.                            Initializing the Array
  472.  
  473.           You must initialize "screline" before using it. This can be done
  474. any way you like-- with assignment statements, reads, Move, etc. You should
  475. assign an initial value to "maxline" elements in screline, where "maxline" is
  476. equal to the maximum number of lines on the screen plus 1. Be sure to keep
  477. "lastring" synchronized with the actual number of elements of screline in use.
  478.  
  479.  =============================================================================
  480.  
  481.                          Compatibility Consideration
  482.  
  483.           The Centiwrite editor uses direct screen writes (through Turbo
  484.  Pascal's CRT unit). This may cause problems, particularly with windowing
  485.  environments such as Desqview or Concurrent DOS. If you need to write to
  486.  the screen using the video BIOS functions, place the line "uses crt" in
  487.  your main program and set the built-in CRT variable DirectVideo to "false".
  488.  Otherwise, DirectVideo will be assumed to be "true".
  489.  
  490.  =============================================================================
  491.  
  492.                        For Extra Punch in Your Program
  493.  
  494.           If you want to use a "plug-in editor" in your program, but feel
  495. Centiwrite just isn't powerful enough, don't walk away feeling dejected.
  496. Here's good news! Also available is an editor similar to Centiwrite but ten
  497. times as powerful. It's Deciwrite! The Deciwrite Developer's Kit includes all
  498. the features of Centiwrite PLUS:
  499.  
  500. 1. Automatic word wrap and paragraph reformatting.
  501. 2. Full support for binary files.
  502. 3. Time and date can be inserted into the text with one keystroke.
  503. 4. Full source code-- including liminput, a replacement for readln; dectohex
  504.    and hextodec, hexadecimal conversion routines; and FileCheck, which checks
  505.    for the existence of a file and determines if it is read-only; and more!
  506.  
  507.           What's more, if you're not sure, you can "lock in" the price of
  508. the Deciwrite Developer's Kit by buying the Centiwrite Developer's Kit NOW.
  509. You'll have one year to upgrade at the current price (plus $1 for shipping),
  510. PLUS you get a credit for what you paid for the Centiwrite Developer's Kit.
  511. What's to lose? Send electronic mail to the addresses listed earlier to learn
  512. how to take advantage of this great offer.
  513.  
  514.  =============================================================================
  515.  
  516.                            Down to Brass Tacks
  517.  
  518.       As of April 1, 1989, this is the Centiwrite/Deciwrite price list.
  519.  
  520.                                     Individual License        Site License
  521.       Centiwrite 1.10                    $20.00                  $250.00
  522.       Deciwrite  1.10                    $30.00                  $500.00
  523.       Deciwrite  1.10 Demo Disk          $ 4.00                  *******
  524.       Centiwrite 1.10 Developer's Kit
  525.                  For Turbo Pascal 4.0    $30.00                  $500.00
  526.                  For Turbo Pascal 5.0    $32.50                  $550.00
  527.                  Upgrade to 5.0          $ 5.00                  $ 60.00
  528.       Deciwrite 1.10 Developer's Kit     $75.00                  $950.00
  529.       Disk replacement fee               $ 3.00                    none
  530.  
  531.       New York State residents and businesses MUST add their local sales tax
  532.       or provide proof of exemption. Send electronic mail if you are uncertain
  533.       of your local tax rate.
  534.  
  535.       Residents of other states will in most cases be required to remit the
  536.       appropriate tax directly to their state tax department.
  537.  
  538.       The Deciwrite Demo Disk includes a $3.00 discount off the purchase
  539.       price of Deciwrite 1.10 for the original purchaser of the demo.
  540.  
  541.       An individual license permits the user to operate the program on
  542.       a single computer at a time, while a site license permits unlimited use
  543.       within the confines of a contiguous area of the owner's property.
  544.  
  545.       These prices are guaranteed not to increase through July 1, 1989.
  546.  
  547.       Custom implementations of these programs are also available on
  548.       request for modest additional fees. Send electronic mail to one
  549.       of the addresses listed earlier.
  550.  
  551.       If you would like to use your Visa or MasterCard to register this
  552.       program, you may order through the Public (Software) Library.
  553.       The number to call for orders is 1-800-2424-PSL (1-800-242-4775).
  554.       Information and questions about orders is available from the PSL
  555.       at 713-665-7017. You may also write to the PSL at P.O. Box 35707,
  556.       Houston, TX 77235-5705, or send electronic mail via CompuServe to
  557.       71355,470. When writing, you should sign your letter, include your
  558.       card number and its expiration date, and specify that you want to
  559.       register Centiwrite, (CWRITE.ARC), by Andrew M. Saucci, Jr. Please
  560.       note that the PSL is not equipped to answer questions about Centiwrite
  561.       itself. Such questions are best directed to one of the electronic
  562.       mail addresses listed earlier. Also note that no surcharge
  563.       is imposed on credit card orders.
  564.  
  565.       Make checks payable to
  566.  
  567.       Andrew M. Saucci, Jr.
  568.       641 Koelbel Ct
  569.       Baldwin, NY 11510-3915.
  570.  
  571.       Please specify the disk size you require.
  572.  
  573.       You may wish to check one of the electronic mail addresses to verify
  574.       that the above address is current. Please use this "physical" address
  575.       ONLY for orders, unless you lack a modem. All other correspondence,
  576.       including technical support questions, should be directed to one of
  577.       the electronic mail addresses whenever possible.
  578.  
  579.  ============================================================================
  580.  
  581.               Before Going to the Highest Court in the Land
  582.  
  583.    This program is produced by a member of the Association of Shareware
  584. Professionals (ASP). ASP wants to make sure that the shareware principle
  585. works for you. If you are unable to resolve a shareware-related problem with
  586. an ASP member by contacting the member directly, ASP may be able to help. The
  587. ASP Ombudsman can help you resolve a dispute or problem with an ASP member,
  588. but does not provide technical support for members' products. Please write to
  589. the ASP Ombudsman at P.O. Box 5786, Bellevue, WA 98006 or send a CompuServe
  590. message via EasyPlex to ASP Ombudsman 70007,3536.
  591.  
  592.  ============================================================================
  593.  
  594.                              Special Bonus
  595.  
  596.           All registered users of the Centiwrite Developer's Kit are also
  597. licensed to use the stand-alone version of Centiwrite (CWRITE.EXE) at no
  598. additional charge. CWRITE.EXE is included on the distribution disk that will
  599. be sent to you when your order is received. Also, registered users receive
  600. the source code for DIRALL.EXE, one of the programs provided to registered
  601. users of the stand-alone version of Centiwrite. DIRALL.EXE provides a
  602. regular directory listing, but highlights hidden files in boldface.
  603.  
  604.  ============================================================================
  605.  
  606.                                Boilerplate
  607.  
  608.           Liability in the event of defects in Centiwrite 1.10 and/or the
  609. Centiwrite 1.10 Developer's Kit is expressly limited to replacement of the disk
  610. on which Centiwrite and/or the Developer's Kit was originally provided. No
  611. other liability of any sort is either implied or assumed. In particular, the
  612. user is responsible for all consequential damages, such as loss of income,
  613. loss of data, pain and suffering, etc.
  614.  
  615.  ============================================================================
  616.  
  617.                         To All Those Who Helped
  618.  
  619.           Thanks to all those who gave their assistance toward the completion
  620. of this program, especially Michael Day, Neil Rubenking, Scott Bussinger, and
  621. all the other helpful people who frequent Borland's Programming Forum A
  622. (BPROGA) on CompuServe. It's truly amazing!
  623.  
  624.  ============================================================================
  625.  
  626.                            Coming Attractions
  627.  
  628.           A plan to produce a full-size text editor based on Centiwrite and
  629. Deciwrite is in the works. Please use Centiwrite to write a short note
  630. describing a few of the features you would like to see in a text editor,
  631. particularly anything that is not found in other programs, and send it to one
  632. of the electronic mail addresses. The result could be a really good program.
  633. You might also indicate what incentives are most likely to cause you to
  634. purchase registered copies of programs distributed on a "try-before-you-buy"
  635. basis. Your suggestions will be most appreciated.
  636.  
  637.  ============================================================================
  638.  
  639.                                It's Alive!
  640.  
  641.           This program is not carved in stone. Many of you no doubt have
  642. extensive experience in this field, and your comments and suggestions are
  643. valuable and welcome. Send them to the electronic mail addresses listed.
  644.  
  645.  ============================= END OF FILE ===================================
  646.